所謂的物件導向程式開發,我常用一個派(a pie)來摘其要,也就是抽象化、多型、繼承、封裝,而JavaScript缺乏類別(class)、interface、extend...等語法,因此也有人認為JavaScript跟本就不能稱之為物件導向的程式語言。而且從名稱上就明指它就是個script語言,何苦來哉要跟人家物件導向來,導向去的。
究竟是不是,以小弟的程度也很難判斷,不過JavaScript裡面所有的東西都是物件,這一點是很明確的,而利用它語言本身去模擬出物件導向的一些封裝、多型的機制,也是辦得到的。至於為什麼要這樣做呢,當然是看上了reuse這個好處。
javascript-oo(英文)
這篇一開始以wikipedia在定義JavaScript時,沒有提到它是種OO語言作引子,來探討JavaScript的特性,作者認為JS應該稱作OO-like,而非OO,因為他缺乏一些OO機制,像是JS沒有一些保護的機制,所有的東東都是public的。但他也說也許是因為JS已經good enough,來做OO,因此一般人還是以OO統稱。
後文就介紹如何用JS來作OO的程式設計,像是建立Class、多重建構子、實體變數和方法、靜態變數和方法等。
想深入JavaScript的朋友不妨可以一讀,對這方面有研究的朋友也拜請提供一些資訊,讓好小弟我能多多學習
建議看一下這個網站:
http://www.crockford.com/裡面關於javascript特性的一些深入介紹。(網路上還有不少好文)
其實關於Javascript的特性,最重要的是ECMA-262 Edition3標準,不過這個標準只說javascript是這樣設計的,而沒有說為何這樣設計以及如果要做出某種效果需要利用到它的甚麼設計
如果要簡單而精確地描述這個語言的特性,可以說它是一個兼具prototype inheritance與functional programming language特性的動態script語言。
prototype inheritance的特性主要在使用幾個關鍵字時用到,包括this、new、prototype等。而functional programming language的特性在它lexical scope(execution context與scope chain)、匿名函數、可以用函數作為變數傳參或作為函數回傳值等特性上。OO是綜合了這些特性做出來的效果。
常看fillano大大發表在ithome部落格的文章,一些JavaScript的文字都寫得相當深入,只是小弟程度還不夠,沒辦法全部理解,不過還是有開眼界長知識的功效,謝謝了。
我對部落格上面有「專業的業餘程式設計」,這麼說來,fillano不是從事程式開發的相關工作囉,那為什麼會對JS有這麼深的研究和興趣呢?
fillano在IT之外的學問也相當廣博,真可說得上是一個Renaissance man。
目前是專業的IT宅男了....
雖然過很久了,還是補充一下意見。
先看一下這一篇:
http://lists.squeakfoundation.org/pipermail/squeak-dev/1998-October/017019.html
如果不知道Alan Kay是誰:
http://en.wikipedia.org/wiki/Alan_Kay
基於OOP這個名詞的發明人的意見,prototype base一樣是OO,所以不能說Javascript不是一個物件導向語言。
JavaScript做class滿好用的
不過他不是用class來宣告類別
而是利用這種
function myClass()
{
this.property1 = null;
this.property2 = null;
this.method1 = function ()
{
}
this.method2 = function ()
{
}
}
最神奇的還有下面這一種
myClass.prototype.property3 = null;
myClass.prototype.property4 = null;
myClass.prototype.method3 = function ()
{
}
myClass.prototype.method4 = function ()
{
}
還可以動態抽換某一個method的內容!
動態指定某一個method = 新的 function ()
var i = 7;
myObject = new myClass();
if (i == 7)
{
myObject.method4 = function ()
{
}
}
myObject.method4();
JavaScript真是太神奇了!
要做好一個library,jquery是一個非常精簡的典範,可以多看他的原始碼。例如看他怎樣幾個步驟就做出一個可以延伸的架構,這部份非常巧妙。
另外就是要學習closure、higher order function等這些重要的函數語言特性,他們可以加強標準的prototype base oop的功能。